package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

class CodeGeneratorMySQL {

    /**
     * 项目根路径
     */
    private static final String PROJECT_PATH = "E:\\yuanzheng-codebase\\m-framework\\dynamicdatasource";

    /**
     * 注释@auth 名称
     */
    private static final String AUTH = "yuanzheng";

    /**
     * 父包全限定类名
     */
    private static final String PARENT = "com.example.demo";

    /**
     * 模块名称
     */
    private static final String MODEL_NAME = "devidViewManager";

    /**
     * 忽略的表前缀
     */
    private static final String[] IGNORE_TABLE_PFX = new String[]{"t_", "tm_"};

    /**
     * 要生成的表名,可以设置多个表
     */
    private static final String TABLE_NAMES = "devid_view";

    /**
     * 数据源配置
     */
    private static final DataSourceConfig DSC = new DataSourceConfig();

    static {
        DSC.setDbType(DbType.MYSQL);
        DSC.setUrl("jdbc:mysql://192.168.0.106:3306/rddsj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
        DSC.setDriverName("com.mysql.cj.jdbc.Driver");
        DSC.setUsername("root");
        DSC.setPassword("xatx!QW@1qw2");
    }

    @Test
    void test() {
        main(null);
    }

    static void main(String[] args) {

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        /*
         * 全局配置
         */
        GlobalConfig gc = new GlobalConfig();
        // 输出路径
        gc.setOutputDir(PROJECT_PATH + "/src/main/java");
        // 设置作者
        gc.setAuthor(AUTH);
        // 生成代码后，是否打开文件夹
        gc.setOpen(false);
        // 是否覆盖原来代码
        gc.setFileOverride(false);
        // 去掉service的I前缀,一般只需要设置service就行
//        gc.setServiceName("%sService");
//        gc.setMapperName("%sMapper");
//        gc.setXmlName("%sMapper");
//        gc.setServiceImplName("%sServiceImpl");
//        gc.setControllerName("%sController");
        // 日期格式
        gc.setDateType(DateType.ONLY_DATE);
        // 实体属性 Swagger2 注解,实体类上会增加注释
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        /*
         * 数据源配置
         */
        mpg.setDataSource(DSC);

        /*
         * 配置模板（generator默认的是velocity，使用freemarker的话要打开此项设置）
         */
        // mpg.setTemplateEngine(new FreemarkerTemplateEngine());


        /*
         * 包配置
         */
        PackageConfig pc = new PackageConfig();
        pc.setParent(PARENT);
        pc.setModuleName(MODEL_NAME);
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        /*
         * 策略配置
         */
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude(TABLE_NAMES);
        strategy.setTablePrefix(IGNORE_TABLE_PFX);
        // 包的命名规则，使用驼峰规则
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 列的名称，使用驼峰规则
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否使用lombok（要确认项目是否有lombok）
        strategy.setEntityLombokModel(true);
        // 是否使用
        strategy.setRestControllerStyle(true);
        // 逻辑删除（要结合数据表字段使用）
        strategy.setLogicDeleteFieldName("is_delete");

        // 自动填充字段
        TableFill fillInsert = new TableFill("create_time", FieldFill.INSERT);
        TableFill fillUpdate = new TableFill("update_time", FieldFill.UPDATE);
        List fillLists = new ArrayList();
        fillLists.add(fillInsert);
        fillLists.add(fillUpdate);
        strategy.setTableFillList(fillLists);
        //乐观锁
        //strategy.setVersionFieldName("version");
        mpg.setStrategy(strategy);

        // 执行
        mpg.execute();

    }
}
